package com.zjl.redis.第19章_IO多路复用;

/**
 * select其实就是把NIO中用户态要遍历的fd(文件描述符)数组
 * (我们的每一个socket链接， 安装进ArrayList里面的那个)
 * ************拷贝到了内核态，让内核态来遍历，********
 * 因为用户态判断socket是否有数据还是要调用内核态的，所有拷贝到内核态后，
 * 这样遍历判断的时候就不用一直用户态和内核态频繁切换了
 *
 * 缺点
 * 1、bitmap最大1024位，一个进程最多只能处理1024个客户端
 * 2、&rset 不可重用，每次socket有数据就相应的位会被置位
 * 3、文件描述符数组拷贝到了内核态(只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知) )，仍然有开销。
 *  select调用需要传入fd数组，需要拷贝一份到内核，高并发场景下这样的拷贝消耗的资源是惊人的。(可优化为不复制)
 * 4、select并没 有通知用户态哪一个socket有数据，仍然需要O(n)的遍历。
 *   select 仅仅返回可读文件描述符的个数，具体哪个可读还是要用户自己遍历。
 *   (可优化为只返回给用户就绪的文件描述符，无需用户做无效的遍历)
 */
public class E2_select {

}
